/* 
    模块系统中，每个模块都是相互独立的
    模块内部定义的变量是私有的，只能在模块内部使用，而模块外部不能加载
    如果需要将部分功能对外提供使用，可以通过特定的语法公开

*/
/* 
    模块作用域变量:Node环境下由node提供的类似于全局变量的特殊变量，但是该变量和模块本身由关系
    不同的模块使用该变量时，值不同

*/
// console.log("文件真实路径(不带文件名)",__dirname);
// console.log("文件真实路径(带文件名)",__filename);
// console.log("module",module);
// console.log("exports",exports);

/*  
Module {
    id: '模块的唯一标识',
    path: '模块的加载路径',
    exports: {当前模块公开的数据},
    parent: 父模块的相关信息,
    filename: '当前模块的真实路径',
    loaded: 当前模块是否被加载,
    children: [当前模块加载的子模块],
    paths: [
        搜索路径
    ]
  }
 */

/* 
模块包装器:
  1.保持顶层的变量只作用在模块范围内
    require加载模块时，将读取且完成解析的模块代码，存放在一个js的闭包函数中，而该闭包函数就是模块包装器

  2.有助于提供一些模块即的共享变量或者方法，模块作用域变量

module:
    该变量的对应取值，是对应的模块加载时进行值的构建
    构建的值只会和当前模块文件有关，取值的内容每个模块也不同
    该变量在构建时被赋予数据，是当前模块的相关系统和环境信息，
    所以可以直接认为node环境下，该变量就是模块的身份信息对象

*/


// 基于module对象提供的模块的基本信息数据，衍生了各种模块作用域变量

//模块包装器
// (function(module){
//     let exports = module.exports;
//     let __filename = module.filename;
//     let __dirname = module.path;
// 	//----->
//     // 模块代码在这里
//     //<----- 
//     return module.epxorts;
// });

/* var res=(function(形参){
    let moduleA='moduleA';
    exports.printA=function(){
        console.log(moduleA);
    };
    exports.prinFileName=function(){
        console.log(__filename);
    };
    exports.printModule=function(){
        console.log(module);
    };
    return exports;

})(实参);
 */
// console.log(res);

// 等同于require(实参)


const result=require("./module3/moduleA.js");
console.log(result);
result.printModule();

